package com.autonavi.yunda.yunji.core.utils.diling;

import java.math.BigDecimal;
import java.util.regex.Pattern;

/**
 * 字符串工具类
 */
public class ObjectUtil {


    private static final String NUM_RULE = "^[-\\+]?[\\d]+(.[\\d]+)?$";

    /**
     * 判断是否为数字，包括double和float
     *
     * @param o 传入Object
     * @return 是数字返回true, 否则返回false
     */
    public static boolean isNumber(Object o) {
        if (isEmpty(o)) {
            return false;
        }
        Pattern pattern = Pattern.compile(NUM_RULE);
        return isNumberType(o) || pattern.matcher(trim(o)).matches();
    }

    /**
     * 是数字返回false,否则返回true
     *
     * @param o 传入Object
     * @return 是数字返回true, 否则返回false
     */
    public static boolean isNotNumber(Object o) {
        return !isNumber(o);
    }

    private static boolean isNumberType(Object o) {
        return (o instanceof Number);
    }

    /**
     * 是否为空白,包括null、""和空格
     */
    public static boolean isEmpty(Object o) {
        return o == null || o.toString().trim().length() == 0
                || "null".equals(o.toString().trim().toLowerCase());
    }

    /**
     * 是否为空白,包括null、""和空格
     */
    public static boolean isNotEmpty(Object o) {
        return !isEmpty(o);
    }

    /**
     * 是否为空白,包括null、""和空格
     */
    public static String trim(Object o) {
        return o == null ? null : o.toString().trim();
    }

    /**
     * 返回有效的浮点小数
     *
     * @param usePointLen:小数长度
     * @param val:要处理的浮点数
     */
    public static Double getUseDouble(Double val, Integer usePointLen) {
        BigDecimal b = new BigDecimal(val);
        return b.setScale(usePointLen, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * Object to String
     */
    public static String parseString(Object o) {
        if (o == null) {
            return null;
        }
        return o.toString();
    }

    public static String parseStringNull(Object o) {
        if (o == null) {
            return "null";
        }
        return o.toString();
    }

    /**
     * Object to Long
     */
    public static Long parseLong(Object o) {
        if (!isNumber(o)) {
            return null;
        }
        return isNumberType(o) ? ((Number) o).longValue() : Long.parseLong(trim(o));
    }

    /**
     * Object to Integer
     */
    public static Integer parseInteger(Object o) {
        if (!isNumber(o)) {
            return null;
        }
        return isNumberType(o) ? Math.round(((Number) o).floatValue()) : Math.round(Float.valueOf(trim(o)));//包含四舍五入
    }

    /**
     * Object to Float
     */
    public static Float parseFloat(Object o) {
        if (!isNumber(o)) {
            return null;
        }
        return isNumberType(o) ? ((Number) o).floatValue() : Float.parseFloat(trim(o));
    }

    /**
     * Object to Double
     */
    public static Double parseDouble(Object o) {
        if (!isNumber(o)) {
            return null;
        }
        return isNumberType(o) ? ((Number) o).doubleValue() : Double.parseDouble(trim(o));
    }


}
